﻿// TODO: Insertar filtros en la busqueda rangos y las fechas
// TODO: Configurar IIS para localhost
// TODO: Dar de baja a un usuario
// TODO: Validar pass nueva en la funcion ModificarPassUsuario 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;
using System.Web.Script.Serialization;
using HotelesWeb.DACHotelesWeb;
using System.Text;
using HotelesWeb.Clases;

namespace HotelesWeb
{
    /// <summary>
    /// Descripción breve de WSHoteles
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // Para permitir que se llame a este servicio web desde un script, usando ASP.NET AJAX, quite la marca de comentario de la línea siguiente. 
    [System.Web.Script.Services.ScriptService]
  
    public class WSHoteles : System.Web.Services.WebService
    {
        #region Prueba

            /// <summary>
            /// Hola mundo de toda la vida (prueba)
            /// </summary>
            /// <returns>String saludando</returns>
            [WebMethod]
            [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
            public string HelloWorld(String Nombre)
            {
                return "Hola " + Nombre;
            }

        #endregion Prueba

        #region Usuarios
        
            /// <summary>
            /// Dará acceso al usuario si sus datos son correctos y devuelve sus datos.
            /// </summary>
            /// <returns></returns>
            [WebMethod]
            public Object AccederUsuario(String Usuario, String Contraseña)
            {
                try
                {
                    DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                    Contraseña = Tools.EncriptarContraseña(Contraseña);

                    var query = (new
                    {
                        Resultado = true,
                        Usuario = (from u in ctx.Usuarios.AsEnumerable()
                                    where u.Usuario == Usuario && u.Contraseña == Contraseña
                                    select new
                                    {
                                        IdUsuario = u.Id,
                                        Nombre = u.Nombre,
                                        Apellido1 = u.Apellido1,
                                        Apellido2 = u.Apellido2,
                                        FechaNacimiento = u.FechaNacimiento.ToString("dd/MM/yyyy"),
                                        Direccion = u.Direccion,
                                        Poblacion = u.Poblacion,
                                        Provincia = u.Provincia,
                                        Email = u.Email,
                                        Telefono = u.Telefono
                                    }).FirstOrDefault()
                    });

                    if (query.Usuario != null)
                    {
                        return query;
                    }
                    else
                    {
                        return new
                        {
                            Resultado = false,
                            Mensaje = "Usuario o contraseña incorrectos."
                        };
                    }
                }
                catch (Exception oe)
                {
                    return new
                    {
                        Resultado = false,
                        Mensaje = oe.Message
                    };
                }
            }

            /// <summary>
            /// Guarda los datos del usuario que se quiere registrar o que ha editado su perfil
            /// </summary>
            /// <returns></returns>
            [WebMethod]
            public Object GuardarUsuario(Usuarios DatosUsuario)
            {
                try
                {
                    DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                    DatosUsuario.Contraseña = Tools.EncriptarContraseña(DatosUsuario.Contraseña);
                    ctx.Usuarios.Add(DatosUsuario);
                    ctx.SaveChanges();

                    return new
                    {
                        Resultado = true
                    };
                }
                catch (Exception oe)
                {
                    return new
                    {
                        Resultado = false,
                        Mensaje = oe.Message
                    };
                }
            }

            /// <summary>
           /// 
           /// </summary>
           /// <param name="idUsuario"></param>
           /// <returns></returns>
            [WebMethod]
            public Object ObtenerDatosPerfil(int idUsuario)
            {
                try
                {
                    DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                    var query = (new
                    {
                        Resultado = true,
                        Usuario = (from u in ctx.Usuarios.AsEnumerable()
                                   where u.Id == idUsuario
                                    select new
                                    { 
                                        NombreUsuario = u.Usuario,
                                        Nombre = u.Nombre,
                                        Apellido1 = u.Apellido1, 
                                        Apellido2 = u.Apellido2,
                                        Direccion = u.Direccion, 
                                        Poblacion = u.Poblacion, 
                                        Provincia = u.Provincia,
                                        Email = u.Email,
                                        Telefono = u.Telefono,
                                        FechaNacimiento = u.FechaNacimiento.ToString("dd/MM/yyyy"),
                                        Reservas = (from r in u.Reservas.AsEnumerable()
                                                    select new{
                                                        idReserva = r.Id,
                                                        FechaEntrada = r.Fecha_Entrada.ToString("dd-MM-yyyy"),
                                                        FechaSalida = r.Fecha_Salida.ToString("dd-MM-yyyy"),
                                                        Noches = r.Noches,
                                                        Precio = r.PrecioTotal.ToString("c2"),
                                                        Hotel = r.Hoteles.Nombre
                                                    })
                                    }).FirstOrDefault(),
                    });

                    if (query.Usuario != null)
                    {
                        return query;
                    }
                    else
                    {
                        return new
                        {
                            Resultado = false,
                            Mensaje = "Usuario o contraseña incorrectos."
                        };
                    }
                }
                catch (Exception oe)
                {
                    return new
                    {
                        Resultado = false,
                        Mensaje = oe.Message
                    };
                }
            }

            /// <summary>
            /// 
            /// </summary>
            /// <param name="idUsuario"></param>
            /// <returns></returns>
            [WebMethod]
            public Object ModificarDatosUsuario(int idUsuario, String nombre, String primerApellido, String segundoApellido, String direccion,
                                                String poblacion, String provincia, String email, DateTime fechaNacimiento, String telefono )
            {
                try
                {
                    DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                    var usuario = ctx.Usuarios.Where(u => u.Id == idUsuario).First();

                    usuario.Nombre = nombre;
                    usuario.Apellido1 = primerApellido;
                    usuario.Apellido2 = segundoApellido;
                    usuario.Direccion = direccion;
                    usuario.Poblacion = poblacion;
                    usuario.Provincia = provincia;
                    usuario.Email = email;
                    usuario.FechaNacimiento = fechaNacimiento;
                    usuario.Telefono = telefono;

                    ctx.SaveChanges(); 

                    return new
                    {
                        Resultado = true,
                        Mensaje = "Datos usuario modificados correctamente."
                    };
                }
                catch (Exception oe)
                {
                    return new
                    {
                        Resultado = false,
                        Mensaje = oe.Message
                    };
                }
            }


            /// <summary>
            /// 
            /// </summary>
            /// <param name="idUsuario"></param>
            /// <param name="nuevaPass"></param>
            /// <returns></returns>
            [WebMethod]
            public Object ModificarPassUsuario(int idUsuario, String antiguaPass, String nuevaPass)
            {
                try
                {
                    DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                    var usuario = ctx.Usuarios.Where(u => u.Id == idUsuario).First();

                    Boolean resultado = true;
                    String mensaje = String.Empty;
                    if (usuario.Contraseña == Tools.EncriptarContraseña(antiguaPass))
                    {
                        usuario.Contraseña = Tools.EncriptarContraseña(nuevaPass);

                        ctx.SaveChanges();

                        resultado = true;
                        mensaje = "Contraseña modificada correctamente.";

                        Tools.EnviarCorreo(usuario.Email, String.Format("Contraseña modificada correctamente.\nLa nueva contraseña es: {0}", nuevaPass));
                    }
                    else
                    {
                        resultado = false;
                        mensaje = "La contraseña antigua no es correcta";
                    }

                    return new { Resultado = resultado, Mensaje = mensaje };
                }
                catch (Exception oe)
                {
                    return new
                    {
                        Resultado = false,
                        Mensaje = oe.Message
                    };
                }
            }

            /// <summary>
            /// 
            /// </summary>
            /// <param name="idUsuario"></param>
            /// <param name="nuevaPass"></param>
            /// <returns></returns>
            [WebMethod]
            public Object DardeBajaUsuario(int idUsuario)
            {
                try
                {
                    DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                    Usuarios usuario = ctx.Usuarios.Where(u => u.Id == idUsuario).First();

                    ctx.Usuarios.Remove(usuario);
                    ctx.SaveChanges();

                    return new { 
                        Resultado = true,
                        Mensaje = "Usuario dado de baja correctamente" 
                    };
                }
                catch (Exception oe)
                {
                    return new
                    {
                        Resultado = false,
                        Mensaje = oe.Message
                    };
                }
            }
        
        #endregion Usuarios

        #region Cadenas

        /// <summary>
        /// Obtiene las 5 mejores cadenas hoteleras del sitio
        /// </summary>
        /// <returns></returns>
        [WebMethod]
        public Object ObtenerCadenasHoteleras()
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                var query = (new
                {
                    Resultado = true,
                    Cadenas = (from c in ctx.Cadenas
                               select new {
                                   idCadena = c.Id,
                                   nombre = c.Nombre,
                                   imagen = c.Ruta_Imagen,
                               }).Take(5) 
                });

                return query;
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.ToString()
                };
            }
        }


        #endregion

        #region Hoteles

        /// <summary>
        /// Obtiene los cinco primeros hoteles disponibles en la web
        /// </summary>
        /// <returns></returns>
        [WebMethod]
        public Object ObtenerRankingHoteles()
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

        /*        var topReservas = (from r in ctx.Reservas
                                    group r by r.HotelesId into grupoReservas
                                    select new
                                    {
                                        IdHotel = grupoReservas.Key,
                                        NumReservas = grupoReservas.Count()
                                    }).Take(5).ToList();
                */
                var query = (new
                {
                    Resultado= true,
                    HotelesMasReservados = (from h in ctx.Hoteles join r in
                                                (from r in ctx.Reservas
                                                    group r by r.HotelesId into grupoReservas
                                                    select new
                                                    {
                                                        IdHotel = grupoReservas.Key,
                                                        NumReservas = grupoReservas.Count()
                                                    }).Take(5)  on h.Id equals r.IdHotel
                                            orderby r.NumReservas descending
                                            select new
                                            {
                                                IdHotel = h.Id,
                                                Nombre = h.Nombre,
                                                Poblacion = h.Poblacion,
                                                Provincia = h.Provincia,
                                                Votos = h.Num_Votos,
                                                Puntuacion = h.Puntuacion,
                                                Clasificacion = h.Clasificacion,
                                                Portada = h.Imagen_Portada,
                                                NumReservas = r.NumReservas
                                            }).ToList(),
                    HotelesMasValorados = (from h in ctx.Hoteles
                                            orderby h.Num_Votos descending
                                            select new
                                            {
                                                IdHotel = h.Id,
                                                Nombre = h.Nombre,
                                                Poblacion = h.Poblacion,
                                                Provincia = h.Provincia,
                                                Votos = h.Num_Votos,
                                                Puntuacion = h.Puntuacion,
                                                Clasificacion = h.Clasificacion,
                                                Portada = h.Imagen_Portada
                                            }).Take(5).ToList()
                });

                return query;
            }
            catch (Exception oe)
            {
                return new { 
                                Resultado = false, 
                                Mensaje = oe.ToString()
                            };
            }
        }
        
        /// <summary>
        /// Obtiene las localidades disponibles (las que tienen los hoteles)
        /// </summary>
        /// <returns></returns>
        [WebMethod]
        public Object ObtenerLocalidades()
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                var query = (new
                {
                    Resultado= true,
                    Localidades= (from h in ctx.Hoteles
                                    select new{
                                        Localidad = h.Poblacion
                                    }).Distinct().ToList()
                });

                return query;
            }
            catch (Exception oe)
            {
                return new { 
                                Resultado = false, 
                                Mensaje = oe.Message
                            };
            }
        }

        [WebMethod]
        public Object ObtenerBusquedaAvanzada(String Texto, int MinPuntuacion, int MaxPuntuacion, Boolean HabIndividual, Boolean HabDoble2, Boolean HabDoble1,
                                                DateTime FechaEntrada, DateTime FechaSalida, String Localidad, Boolean Wifi, Boolean Parking,
                                                Boolean Restaurante, Boolean Mascotas, Boolean Piscina, Boolean Spa, Boolean Gimnasio, Boolean Reuniones)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();
                var Hoteles = (from h in ctx.Hoteles.AsEnumerable()
                               where h.Nombre.ToLower().Contains(Texto.ToLower()) && MinPuntuacion <= h.Puntuacion && h.Puntuacion <= MaxPuntuacion
                               select new
                               {
                                   idHotel = h.Id, 
                                   cadena = h.Cadenas.Nombre,
                                   nombre = h.Nombre,
                                   direccion = h.Direccion,
                                   poblacion = h.Poblacion,
                                   provincia = h.Provincia,
                                   habitaciones = h.Num_Habitaciones,
                                   fechaEntrada = h.Entrada.ToString(@"hh\:mm"),
                                   FechaSalida = h.Salida.ToString(@"hh\:mm"),
                                   cancelacion = h.DiasParaCancelar,
                                   wifi = h.Wifi,
                                   parking = h.Parking,
                                   restaurante = h.Restaurante,
                                   salones = h.Salones_Reuniones,
                                   gimnasio = h.Gimnasio,
                                   mascotas = h.Mascotas,
                                   piscina = h.Piscina,
                                   spa = h.SpaRelax,
                                   puntuación = h.Puntuacion,
                                   votos = h.Num_Votos,
                                   clasificacion = h.Clasificacion,
                                   imagen = h.Imagen_Portada,
                                   telefono = h.Telefono
                               }).ToList();

                // Diferentes filtros booleanos
                if (Wifi) { Hoteles = Hoteles.Where(h => h.wifi).ToList(); }
                if (Parking) { Hoteles = Hoteles.Where(h => h.parking).ToList(); }
                if (Restaurante) { Hoteles = Hoteles.Where(h => h.restaurante).ToList(); }
                if (Reuniones) { Hoteles = Hoteles.Where(h => h.salones).ToList(); }
                if (Gimnasio) { Hoteles = Hoteles.Where(h => h.gimnasio).ToList(); }
                if (Mascotas) { Hoteles = Hoteles.Where(h => h.mascotas).ToList(); }
                if (Piscina) { Hoteles = Hoteles.Where(h => h.piscina).ToList(); }
                if (Spa) { Hoteles = Hoteles.Where(h => h.spa).ToList(); }
  
                var query = new
                {
                    Resultado = true,
                    Hoteles = Hoteles
                };

                return query;
            }
             catch (Exception oe)
             {
                 return new
                 {
                     Resultado = false,
                     Mensaje = oe.Message
                 };
             }
        }

        [WebMethod]
        public Object ObtenerHotelesPorCadena(int idCadena)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                var query = new
                {
                    Resultado = true,
                    Hoteles = (from h in ctx.Hoteles.AsEnumerable()
                               where h.CadenasId == idCadena
                               select new
                               {
                                   idHotel = h.Id, 
                                   cadena = h.Cadenas.Nombre,
                                   nombre = h.Nombre,
                                   direccion = h.Direccion,
                                   poblacion = h.Poblacion,
                                   provincia = h.Provincia,
                                   habitaciones = h.Num_Habitaciones,
                                   fechaEntrada = h.Entrada.ToString(@"hh\:mm"),
                                   FechaSalida = h.Salida.ToString(@"hh\:mm"),
                                   cancelacion = h.DiasParaCancelar,
                                   wifi = h.Wifi,
                                   parking = h.Parking,
                                   restaurante = h.Restaurante,
                                   salones = h.Salones_Reuniones,
                                   gimnasio = h.Gimnasio,
                                   mascotas = h.Mascotas,
                                   piscina = h.Piscina,
                                   spa = h.SpaRelax,
                                   puntuación = h.Puntuacion,
                                   votos = h.Num_Votos,
                                   clasificacion = h.Clasificacion,
                                   imagen = h.Imagen_Portada,
                                   telefono = h.Telefono
                               }).ToList()
                };
                   

                return query;
            }
             catch (Exception oe)
             {
                 return new
                 {
                     Resultado = false,
                     Mensaje = oe.Message
                 };
             }
        }

        /// <summary>
        /// Obtiene las habitaciones de un hotel
        /// </summary>
        /// <param name="idHotel"></param>
        /// <returns></returns>
        [WebMethod]
        public Object ObtenerHabitacionesDeHotel(int idHotel, DateTime FechaEntrada, DateTime FechaSalida)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                DACHotelesWeb.Hoteles hotel = ctx.Hoteles.Where(x => x.Id == idHotel).FirstOrDefault();


                var HabitacionesReservadas = (from r in hotel.Reservas.AsEnumerable()
                                                where r.Fecha_Entrada <= FechaEntrada && FechaEntrada < r.Fecha_Salida||
                                                r.Fecha_Entrada < FechaSalida && FechaSalida <= r.Fecha_Salida ||
                                                FechaEntrada <= r.Fecha_Entrada && r.Fecha_Entrada < FechaSalida ||
                                                FechaEntrada < r.Fecha_Salida && r.Fecha_Salida <= FechaSalida
                                                select r.HabitacionesId);

                var query = new
                {
                    Resultado = true,
                    Descripcion = hotel.Descripcion,
                    Habitaciones = (from hab in hotel.Habitaciones
                                    where !HabitacionesReservadas.Contains(hab.Id)
                                    select new {
                                        idHotel = hab.HotelesId,
                                        idHabitacion = hab.Id,
                                        tipo = hab.Tipo,
                                        descripcion = hab.Descripcion,
                                        precio = hab.Precio_Noche.ToString("c2"),
                                        precioSinFormato = hab.Precio_Noche
                                    }),
                    Imagenes = (from i in hotel.Imagenes
                                select new {
                                    ruta = i.Ruta_Imagen
                                })
                };
                return query;
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }


        #endregion Hoteles

        #region Reservas

        /// <summary>
        /// Guarda los datos de la reserva que se quiere registrar o que ha editado su perfil
        /// </summary>
        /// <returns></returns>
        [WebMethod]
        public Object GuardarReserva(Reservas Reserva)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                ctx.Reservas.Add(Reserva);
                ctx.SaveChanges();

                return new
                {
                    Resultado = true
                };
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }
        #endregion Reservas

        #region Admin

        [WebMethod]
        public Object AccederAdmin(String Usuario, String Contraseña)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();
                
                Contraseña = Tools.EncriptarContraseña(Contraseña);

                var query = (new
                {
                    Resultado = true,
                    Administrador =  (from u in ctx.Administradores
                                where u.Usuario == Usuario && u.Contraseña == Contraseña
                                select new
                                {
                                    IdAdministrador = u.Id,
                                }).Count()
                });

                if (query.Administrador > 0)
                {
                    return query;
                }
                else
                {
                    return new
                    {
                        Resultado = false,
                        Mensaje = "Usuario o contraseña incorrectos."
                    };
                }
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }

        /// <summary>
        /// Obtiene todos los datos que se pueden administrar
        /// </summary>
        /// <returns></returns>
        [WebMethod]
        public Object ObtenerDatosAdministrador()
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                var query = new
                {
                    Resultado = true,
                    Cadenas = (from c in ctx.Cadenas
                               select new {
                                   id = c.Id,
                                   nombre = c.Nombre,
                                   rutaImagen = c.Ruta_Imagen
                               }),
                    Hoteles = (from h in ctx.Hoteles.AsEnumerable()
                               select new {
                                    id = h.Id,
                                    idCadena = h.CadenasId,
                                    nombre = h.Nombre,
                                    descripcion = h.Descripcion,
                                    numeroHabitaciones = h.Num_Habitaciones,
                                    direccion = h.Direccion,
                                    poblacion = h.Poblacion,
                                    provincia = h.Provincia,
                                    telefono = h.Telefono,
                                    clasificacion = h.Clasificacion,
                                    otrosServicios = h.Otros_Servicios,
                                    wifi = h.Wifi,
                                    parking = h.Parking,
                                    restaurante = h.Restaurante,
                                    salon = h.Salones_Reuniones,
                                    gimnasio = h.Gimnasio,
                                    mascotas = h.Mascotas,
                                    piscina = h.Piscina,
                                    spa = h.SpaRelax,
                                    habitaciones = (from hab in h.Habitaciones.AsEnumerable()
                                                    select new {
                                                        id = hab.Id,
                                                        idHotel = hab.HotelesId,
                                                        tipo = hab.Tipo,
                                                        descripcion = hab.Descripcion,
                                                        precio = hab.Precio_Noche.ToString("c2")
                                                    }).ToList()
                               }).ToList(),
                };

                return query;
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }

        /// <summary>
        /// Guarda una cadena en la base de datos
        /// </summary>
        /// <param name="cadena"></param>
        /// <returns></returns>
        [WebMethod]
        public Object GuardarCadenaNueva(Cadenas cadena)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                ctx.Cadenas.Add(cadena);
                ctx.SaveChanges();

                return new
                {
                    Resultado = true,
                    Mensaje = "Cadena hotelera insertada correctamente."
                };
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }

        /// <summary>
        /// Modifica una cadena hotelera
        /// </summary>
        /// <param name="idCadena"></param>
        /// <param name="nombreCadena"></param>
        /// <returns></returns>
        [WebMethod]
        public Object ModificarCadena(int idCadena, String nombreCadena)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                Cadenas cadena = (from c in ctx.Cadenas
                                  where c.Id == idCadena
                                  select c).First();

                cadena.Nombre = nombreCadena;
               
                ctx.SaveChanges();

                return new
                {
                    Resultado = true,
                    Mensaje = "Cadena hotelera modificada correctamente."
                };
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }

        /// <summary>
        /// Borramos una cadena
        /// </summary>
        /// <param name="idCadena"></param>
        /// <returns></returns>
        [WebMethod]
        public Object BorrarCadena(int idCadena)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                Cadenas cadena = (from c in ctx.Cadenas
                                  where c.Id == idCadena
                                  select c).First();
                ctx.Cadenas.Remove(cadena);
                ctx.SaveChanges();

                return new
                {
                    Resultado = true,
                    Mensaje = "Cadena hotelera borrada correctamente."
                };
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }

        /// <summary>
        /// Guardamos habitaciones nuevas en la BBDD
        /// </summary>
        /// <param name="habitacion"></param>
        /// <returns></returns>
        [WebMethod]
        public Object GuardarHabitacionNueva(Habitaciones habitacion)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                ctx.Habitaciones.Add(habitacion);
                ctx.SaveChanges();

                return new
                {
                    Resultado = true,
                    Mensaje = "Habitación guardada correctamente."
                };
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }

        [WebMethod]
        public Object ModificarHabitacion(int idHabitacion, int idHotel, String Tipo, String Descripcion, Decimal Precio_Noche)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                Habitaciones habitacion = ctx.Habitaciones.Where(x => x.Id == idHabitacion).First();

                habitacion.HotelesId = idHotel;
                habitacion.Tipo = Tipo;
                habitacion.Descripcion = Descripcion;
                habitacion.Precio_Noche = Precio_Noche;

                ctx.SaveChanges();

                return new
                {
                    Resultado = true,
                    Mensaje = "Habitación guardada correctamente."
                };
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }

        /// <summary>
        /// Borramos una habitacion
        /// </summary>
        /// <param name="idCadena"></param>
        /// <returns></returns>
        [WebMethod]
        public Object BorrarHabitacion(int idHabitacion)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                Habitaciones habitacion = ctx.Habitaciones.Where(x => x.Id == idHabitacion).First();
                
                ctx.Habitaciones.Remove(habitacion);
                ctx.SaveChanges();

                return new
                {
                    Resultado = true,
                    Mensaje = "Habitación borrada correctamente."
                };
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }

        /// <summary>
        /// Guardamos hoteles nuevos en la BBDD
        /// </summary>
        /// <param name="hotel"></param>
        /// <returns></returns>
        [WebMethod]
        public Object GuardarHotelNuevo(DACHotelesWeb.Hoteles hotel)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                ctx.Hoteles.Add(hotel);
                ctx.SaveChanges();

                return new
                {
                    Resultado = true,
                    Mensaje = "Hotel guardado correctamente."
                };
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }

        /// <summary>
        /// Modificar un hotel
        /// </summary>
        /// <param name="idHotel"></param>
        /// <param name="idCadena"></param>
        /// <param name="nombre"></param>
        /// <param name="direccion"></param>
        /// <param name="poblacion"></param>
        /// <param name="provincia"></param>
        /// <param name="telefono"></param>
        /// <param name="clasificacion"></param>
        /// <param name="otrosServicios"></param>
        /// <param name="wifi"></param>
        /// <param name="parking"></param>
        /// <param name="restaurante"></param>
        /// <param name="salones"></param>
        /// <param name="gimnasio"></param>
        /// <param name="mascotas"></param>
        /// <param name="piscina"></param>
        /// <param name="spa"></param>
        /// <param name="descripcion"></param>
        /// <returns></returns>
        [WebMethod]
        public Object ModificarHotel(int idHotel, int idCadena, String nombre, String direccion, String poblacion, String provincia, 
                                        String telefono, int clasificacion, String otrosServicios, Boolean wifi, Boolean parking,
                                        Boolean restaurante, Boolean salones, Boolean gimnasio, Boolean mascotas, Boolean piscina, 
                                        Boolean spa, String descripcion)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                DACHotelesWeb.Hoteles hotel = ctx.Hoteles.Where(x => x.Id == idHotel).First();

                hotel.CadenasId = idCadena;
                hotel.Nombre = nombre;
                hotel.Direccion = direccion;
                hotel.Poblacion = poblacion;
                hotel.Provincia = provincia;
                hotel.Telefono = telefono;
                hotel.Clasificacion = clasificacion;
                hotel.Otros_Servicios = otrosServicios;
                hotel.Wifi = wifi;
                hotel.Parking = parking;
                hotel.Restaurante = restaurante;
                hotel.Salones_Reuniones = salones;
                hotel.Gimnasio = gimnasio;
                hotel.Mascotas = mascotas;
                hotel.Piscina = piscina;
                hotel.SpaRelax = spa;
                hotel.Descripcion = descripcion;
                
                ctx.SaveChanges();

                return new
                {
                    Resultado = true,
                    Mensaje = "Hotel modificado correctamente"
                };
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }

        /// <summary>
        /// Borramos un hotel
        /// </summary>
        /// <param name="idCadena"></param>
        /// <returns></returns>
        [WebMethod]
        public Object BorrarHotel(int idHotel)
        {
            try
            {
                DACHotelesWeb.FourHotelesEntities ctx = new DACHotelesWeb.FourHotelesEntities();

                DACHotelesWeb.Hoteles hotel = ctx.Hoteles.Where(x => x.Id == idHotel).First();

                ctx.Hoteles.Remove(hotel);
                ctx.SaveChanges();

                return new
                {
                    Resultado = true,
                    Mensaje = "Habitación borrada correctamente"
                };
            }
            catch (Exception oe)
            {
                return new
                {
                    Resultado = false,
                    Mensaje = oe.Message
                };
            }
        }

        #endregion
    }
}
